package bancosys.tec.utils.factory;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 * Cria uma lista de classes que faz parte de uma hierarquia de classes.
 * 
 * @author jrenaut
 */
public class HierarchyClassListFactoryBean extends ClassListFactoryBean {

    private Log log = LogFactory.getLog(HierarchyClassListFactoryBean.class);

    private Class<?> expectedSuperClass;

    /**
     * C'tor
     * 
     * @param expectedSuperClass A super-classe dos elementos da lista retornada por este factory bean
     */
    public HierarchyClassListFactoryBean(Class<?> expectedSuperClass) {
        if (expectedSuperClass == null) {
            throw new IllegalArgumentException("A class must be provided!");
        }
        this.expectedSuperClass = expectedSuperClass;
    }

    /**
     * Aceita a classe se for uma especialização/implementação da classe/interface fornecida no construtor.
     * 
     * @param clazz a classe
     * @return true caso a classe seja uma especialização/implementação
     */
    @Override
    protected final boolean doAccept(Class<?> clazz) {
        boolean ret = this.expectedSuperClass.isAssignableFrom(clazz);
        if (!ret) {
            this.log.error(this.getName() + " ! expected " + this.expectedSuperClass.getName() + " but was "
                    + ((clazz != null) ? clazz.getName() : " null."));
        }
        return ret;
    }
}
